// 抽象类：动物
abstract class Animal {
    public abstract void eat();
}

// 接口：害怕的行为
interface Afraid {
    void escape();
    void makeSounds();
}

// 狗类：继承Animal并实现Afraid接口
class Dog extends Animal implements Afraid {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }

    @Override
    public void escape() {
        System.out.println("狗害怕地跑开了");
    }

    @Override
    public void makeSounds() {
        System.out.println("狗害怕时发出“汪汪”的叫声");
    }
}

// 猫类：继承Animal并实现Afraid接口
class Cat extends Animal implements Afraid {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void escape() {
        System.out.println("猫害怕地躲起来了");
    }

    @Override
    public void makeSounds() {
        System.out.println("猫害怕时发出“喵喵”的叫声");
    }
}

// 人类：操作动物的行为
class Person {
    // 喂动物（多态体现：接收Animal类型，实际传入子类对象）
    public void feed(Animal animal) {
        animal.eat();
    }

    // 捕捉动物（多态体现：接收Afraid接口类型，实际传入实现类对象）
    public void catchAnimal(Afraid afraid) {
        afraid.makeSounds();
        afraid.escape();
    }
}

// 主类：程序入口
class a {
    public static void main(String[] args) {
        Person person = new Person();

        // 父类引用指向子类对象（多态的核心形式）
        Animal dog = new Dog();
        Animal cat = new Cat();

        // 测试喂食行为
        System.out.println("=== 喂食行为 ===");
        person.feed(dog);   // 实际调用Dog的eat()
        person.feed(cat);   // 实际调用Cat的eat()

        // 测试捕捉行为（强制转换为Afraid接口类型，因Dog和Cat均实现了该接口）
        System.out.println("\n=== 捕捉行为 ===");
        person.catchAnimal((Afraid) dog);
        System.out.println("---");
        person.catchAnimal((Afraid) cat);
    }
}